package com.gdlgxy.oa.DAO;

import com.gdlgxy.oa.bean.Student;
import com.gdlgxy.oa.bean.StudentList;
import com.gdlgxy.oa.service.StudentServer;
import com.gdlgxy.oa.utils.DBUtil;

import java.sql.*;

public class StudentListDao implements Dao{
    /**
     * 通过数据库获取学生链表
     *
     * @return 学生链表
     */
    public static StudentList getStudentList() {
        // 创建学生列表
        StudentList list = new StudentList();

        // 连接数据库，查询当前的学生
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            conn = DBUtil.getConnection();
            String sql = "SELECT Sno,Sname FROM t_student";
            ps = conn.prepareStatement(sql);
            rs = ps.executeQuery();

            while (rs.next()) {
                int no = rs.getInt("Sno");
                String Sname = rs.getString("Sname");
                // 添加学生
                list.studentAdd(new Student(no, Sname));
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBUtil.close(conn, ps, rs);
        }

        return list;
    }

    /**
     * 将删除的学生节点同步到数据库中
     *
     * @param list 删除了一个节点后的学生链表
     * @return true删除成功，false删除失败
     */
    public static boolean DelStudentList(StudentList list) {
        // 连接数据库
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String SQL;
        // 判断删除学生是否成功,获取条数
        int count = 0;

        // 获取当前学生的链表中删除的节点
        int no = list.findStudentDel(StudentServer.list());
        System.out.println("DAO:开始删除学生节点，删除的学生节点为" + no);
        // 出现错误，保证关闭的try
        try {
            conn = DBUtil.getConnection();
            // 事务的try
            try {
                conn.setAutoCommit(false);
                // 获取数据库操作对象
                Statement stmt = conn.createStatement();
                // 删除支出记录
                SQL = "DELETE FROM t_fare WHERE Sno=" + no;
                int num = stmt.executeUpdate(SQL);
                System.out.println("DAO:删除学生节点，删除的支出记录的条数为" + num);
                // 删除学生
                SQL = "DELETE FROM t_student WHERE Sno=" + no;
                // 判断删除学生是否成功
                count = stmt.executeUpdate(SQL);
                // 提交事务
                conn.commit();
            } catch (SQLException se) {
                // 失败就回滚事务
                System.out.println(se.getMessage());
                System.out.println("DAO:出现错误，开始回滚事务！！！");
                conn.rollback();

            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBUtil.close(conn, ps, rs);
        }
        if (count > 0) {
            System.out.println("DAO:删除学生节点完成，删除的学生的条数为" + count);
            return true;
        }
        return false;
    }

    /**
     * 将添加的学生节点同步到数据库中
     * @param list 添加了一个节点后的学生链表
     * @return true添加成功，false添加失败
     */
    public static boolean CreateStudentList(StudentList list) {
        // 连接数据库
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String SQL;
        // 判断删除学生是否成功,获取条数
        int count = 0;

        // 获取当前学生的链表中最后的一个节点
        Student temp = list.studentLast();
        System.out.println("DAO:开始添加学生节点，添加的学生节点为" + temp.getNo());
        // 出现错误，保证关闭的try
        try {
            conn = DBUtil.getConnection();
            // 事务的try
            try {
                conn.setAutoCommit(false);
                // 获取数据库操作对象
                Statement stmt = conn.createStatement();
                // 添加学生
                SQL = "INSERT INTO t_student VALUES (" + temp.getNo() + ",'" + temp.getName() + "')";
                System.out.println("DAO:添加学生节点的SQL语句为：" + SQL);
                // 判断添加学生是否成功
                count = stmt.executeUpdate(SQL);
                // 提交事务
                conn.commit();
            } catch (SQLException se) {
                // 失败就回滚事务
                System.out.println(se.getMessage());
                System.out.println("DAO:出现错误，开始回滚事务！！！");
                conn.rollback();

            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBUtil.close(conn, ps, rs);
        }
        if (count > 0) {
            System.out.println("DAO:添加学生节点完成，添加的学生的条数为" + count);
            System.out.println();
            return true;
        }
        return false;
    }

    /**
     * 将修改的学生节点同步到数据库中
     * @param list 修改了一个节点后的学生链表
     * @return true修改成功，false删除失败
     */
    public static boolean UpdateStudentList(StudentList list) {
        // 连接数据库
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String SQL;
        // 判断删除学生是否成功,获取条数
        int count = 0;
        // 获取当前学生的链表中修改的节点
        Student temp = list.findStudentUpdate(StudentServer.list());


        System.out.println("DAO:开始修改学生节点，修改的学生节点为" + temp.getNo());
        // 出现错误，保证关闭的try
        try {
            conn = DBUtil.getConnection();
            // 事务的try
            try {
                conn.setAutoCommit(false);
                // 获取数据库操作对象
                Statement stmt = conn.createStatement();
                // 修改学生
                SQL = "UPDATE t_student SET Sname = '"+ temp.getName() + "' WHERE Sno="+temp.getNo();
                System.out.println("DAO:修改学生节点的SQL语句为：" + SQL);
                // 判断修改学生是否成功
                count = stmt.executeUpdate(SQL);
                // 提交事务
                conn.commit();
            } catch (SQLException se) {
                // 失败就回滚事务
                System.out.println(se.getMessage());
                System.out.println("DAO:出现错误，开始回滚事务！！！");
                conn.rollback();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBUtil.close(conn, ps, rs);
        }
        if (count > 0) {
            System.out.println("DAO:修改学生节点完成，添加的学生的条数为" + count);
            System.out.println();
            return true;
        }
        return false;
    }
}